package com.kgc.ssm.controller;

import com.kgc.ssm.bean.Role;
import com.kgc.ssm.bean.User;
import com.kgc.ssm.constant.CommConstant;
import com.kgc.ssm.service.RoleService;
import com.kgc.ssm.service.UserService;
import com.kgc.ssm.util.PageSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
 * Created On : 2022/9/14.
 * <p>
 * Author : zhukang
 * <p>
 * Description: 用户业务入口
 */
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    /**
     * @author : zhukang
     * @date   : 2022/9/14
     * @param  : [request, response]
     * @return : void
     * @description : 用户登录请求处理方法
     */
    @RequestMapping("/userLogin")
    public String userLogin(HttpServletRequest request, Map<String, Object> map) {
        // 获取用户登录请求参数
        String loginCode = request.getParameter("userCode");
        String loginPwd = request.getParameter("userPassword");

        // 调用业务接口，判断登录用户信息是否正确，正确，跳转到管理主页，否则回到登录页面，提示信息
        User loginUser = userService.getLoginUserInfo(loginCode, loginPwd);

        // 登录成功
        if(loginUser != null){
            // session保存用户的会话信息，最好存实体对象
            request.getSession().setAttribute(CommConstant.LOGIN_USER_SESSION_ID, loginUser.getId());
            request.getSession().setAttribute(CommConstant.LOGIN_USER_SESSION_CODE, loginUser.getUserCode());

            // 为了修改密码校验方便，临时存入用户密码
            request.getSession().setAttribute("userPwd", loginPwd);

            // TODO 可以查询用户的所有角色，放入session中，修改和添加时，直接从session作用域中后去，不需要每次都查询

            // 直接重定向到管理主页
            return "main";
        }

        // 登录失败，重新返回到登录页面，并提示信息
        map.put("error", "用户名或者密码错误");
        return "forward:/login.jsp";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/11
     * @param  : [request, response]
     * @return : void
     * @description : 用户登出请求处理方法
     */
    @RequestMapping("/userLogout")
    public String userLogout(HttpSession session) {
        // 登出业务处理，直接删除用户的会话信息即可
        // 直接删除session对象
        session.invalidate();

        // 重定向到登录
        return "redirect:/login.jsp";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/11
     * @param  : [request, response]
     * @return : void
     * @description : 查询用户列表，带分页
     */
    @RequestMapping("/userList")
    public String userListPage(@RequestParam(required = false) String queryName,
                               @RequestParam(required = false, defaultValue = "0") Integer queryUserRole,
                               @RequestParam(required = false, defaultValue = CommConstant.DEFAULT_INIT_PAGE_NO) Integer pageNo,
                               @RequestParam(required = false, defaultValue = CommConstant.DEFAULT_INIT_PAGE_SIZE) Integer pageSize,
                               Map<String, Object> map){
        // 查询所有的用户角色列表
        List<Role> roleList = roleService.getRoleList();

        // 将角色放到request作用域中
        map.put("roleList", roleList);

        // 根据查询条件，查询总条数
        int totalCount = userService.getUserCountByCondition(queryName, Integer.valueOf(queryUserRole));

        // 封装分页对象
        PageSupport<List<User>> pageSupport = new PageSupport<>();
        pageSupport.setPageSize(pageSize);
        pageSupport.setTotalCount(totalCount);

        // 页码特殊处理
        if(pageNo < 1 || pageSupport.getTotalPage() == 0){
            pageNo = 1;
        } else if(pageNo > pageSupport.getTotalPage()){
            pageNo = pageSupport.getTotalPage();
        }

        // 设置当前页码
        pageSupport.setCurrPageNo(pageNo);

        // 查询所有的用户详情列表，带分页
        List<User> userListPage = userService.getUserListPageByCondition(queryName, queryUserRole, pageSupport.getCurrPageNo(), pageSupport.getPageSize());

        // 添加分页数据
        pageSupport.setData(userListPage);

        // 将用户列表放到request作用域中
        map.put("pageSupport", pageSupport);
        map.put("queryUserName", queryName);
        map.put("queryUserRole", queryUserRole);

        // 内部转发到用户列表页面
        return "userlist";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/12
     * @param  : [request, response]
     * @return : void
     * @description : 查看用户详情
     */
    @RequestMapping("/userInfo")
    public String userInfo(@RequestParam("id") String userId, Map<String, Object> map) {
        // TODO 判断用户编号是否存在，不存在就不跳转

        // 调用业务接口，根据用户编号，查询用户详情
        User userInfo = userService.getUserById(Integer.valueOf(userId));

        // 将用户详情存入request作用域
        map.put("user", userInfo);

        // 转发到用户详情页面
        return "userview";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/12
     * @param  : [request, response]
     * @return : void
     * @description : 跳转修改用户详情
     */
    @RequestMapping("/toUserMod")
    public String toUserMod(@RequestParam("id") Integer userId, Map<String, Object> map) {
        // 查询所有的用户角色列表
        List<Role> roleList = roleService.getRoleList();

        // 将角色放到request作用域中
        map.put("roleList", roleList);

        // 调用业务接口，根据用户编号，查询用户详情
        User userInfo = userService.getUserById(Integer.valueOf(userId));

        // 将用户详情存入request作用域
        map.put("user", userInfo);

        // 转发到用户详情页面
        return "usermodify";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/12
     * @param  : [request, response]
     * @return : void
     * @description : 修改用户详情
     */
    @RequestMapping("/userMod")
    public String userMod(User userForm) {

        // 调用业务接口，修改用户详情
        userService.modUserInfo(userForm);

        // 重定向到用户列表页面
        return "redirect:/userList";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/12
     * @param  : [request, response]
     * @return : void
     * @description : 删除用户详情
     */
    @RequestMapping("/userDel")
    public String userDel(@RequestParam("id") Integer userId){

        // 调用业务接口，根据用户编号，删除用户详情
        userService.delUserInfo(userId);

        // 重定向到用户列表页面
        return "redirect:/userList";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/12
     * @param  : [request, response]
     * @return : void
     * @description : 跳转添加用户详情
     */
    @RequestMapping("/toUserAdd")
    public String toUserAdd(Map<String, Object> map) {

        // 查询所有的用户角色列表
        List<Role> roleList = roleService.getRoleList();

        // 将角色放到request作用域中
        map.put("roleList", roleList);

        // 转发到用户详情页面
        return "useradd";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/12
     * @param  : [request, response]
     * @return : void
     * @description : 添加用户详情
     */
    @RequestMapping("/userAdd")
    public String userAdd(User userForm) {

        // 调用业务接口，修改用户详情
        userService.addUserInfo(userForm);

        // 重定向到用户列表页面
        return "redirect:/userList";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/12
     * @param  : [request, response]
     * @return : void
     * @description : 跳转修改密码
     */
    @RequestMapping("/toUserPwdMod")
    public String toUserPwdMod(Map<String, Object> map) {

        // 转发到用户详情页面
        return "pwdmodify";
    }

    /**
     * @author : zhukang
     * @date   : 2022/8/15
     * @param  : [request, response]
     * @return : void
     * @description : 修改用户密码
     */
    @RequestMapping("/userPwdMod")
    public String userPwdMod(HttpServletRequest request) {
        // 获取修改用户详情的参数
        // 获取原始密码
        String oldPassword = request.getParameter("old_password");
        // 获取新密码
        String newPassword = request.getParameter("new_password");

        // 后台的非空校验(即便前端有校验，后端还是要加必要校验)，能用工具类就用工具类(apache commons-lang)，不推荐手写
        if(StringUtils.isEmpty(oldPassword) || StringUtils.isEmpty(newPassword) ){
            request.setAttribute(CommConstant.SYS_TIP_MESSAGE, "旧密码或新密码不能为空！");
            return "pwdmodify";
        }

        // 修改前，先判断原始面面是否正确，根据登录的用户编号，查询用户详情（也可以从session中获取用户对象）
        // String userId = (String) request.getSession().getAttribute("userId");
        String userPwd = (String) request.getSession().getAttribute("userPwd");
        // 判断旧密码和登录密码是否一致
        if (!oldPassword.equals(userPwd)){
            request.setAttribute(CommConstant.SYS_TIP_MESSAGE, "旧密码不正确！");
            return "pwdmodify";
        }

        // 旧密码正确，执行修改
        if(userService.modUserPwd((Integer) request.getSession().getAttribute("userId"), newPassword)){
            // 修改成功，清除session
            request.getSession().removeAttribute(CommConstant.LOGIN_USER_SESSION_ID);
            request.getSession().removeAttribute(CommConstant.LOGIN_USER_SESSION_CODE);
            return "redirect:/login.jsp";
        } else {
            request.setAttribute(CommConstant.SYS_TIP_MESSAGE, "密码修改失败！");
        }

        return "pwdmodify";
    }
}
